package com.itheima.service;

import com.itheima.pojo.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 认证授权类，取代在配置文件中写死用户名和密码操作
 *      认证判断
 *      授权
 */
public class SpringSecurityUserService implements UserDetailsService {

    //模拟数据库中的用户数据
    public  static Map<String, User> map = new HashMap<>();
    static {
        User user1 = new User();
        user1.setUsername("admin");
        user1.setPassword("admin");//明文密码（没有加密）

        User user2 = new User();
        user2.setUsername("xiaoming");
        user2.setPassword("1234");

        map.put(user1.getUsername(),user1);
        map.put(user2.getUsername(),user2);
    }

    //当配置文件中的springsecurity权限配置中的url路径拦截操作执行时，调用认证管理器时调用UserDetailsService中的loadUserByUsername获取用户名和密码和角色/权限
    //认证和授权的方法
    //参数：页面用户输入的用户名
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("用户输入的用户名为：" + username);


        //1.根据页面用户输入的用户名，查询数据库，判断用户是否存在
        User user = map.get(username);//模拟查询根据用户名查询数据库  user：数据库查询出来的数据
        if(user == null){//认证一：判断用户是否存在
            //用户名不存在
            return null;//认证失败
        }else{//用户存在，可以登陆，可进行角色或权限的赋权操作
            //2.设置角色/权限对应用户进行赋权
            //授权，现在写死了，将来是可以查询数据库
            //2.1.构建权限（不同的用户设置不同的权限/角色）
            List<GrantedAuthority> list = new ArrayList<>();
            //给admin和xiaoming用户，添加了permission_A和permission_B权限
            list.add(new SimpleGrantedAuthority("permission_A"));//授权
            list.add(new SimpleGrantedAuthority("permission_B"));

            //如果是admin用户，添加ROLE_ADMIN角色，如果是xiaoming用户是没有ROLE_ADMIN角色
            if(username.equals("admin")){
                list.add(new SimpleGrantedAuthority("ROLE_ADMIN"));//授予角色
            }
            /**
             * xiaoming:
             *      两个权限：permission_A、permission_B
             * admin:
             *      两个权限：permission_A、permission_B
             *      一个角色：ROLE_ADMIN
             */

            //2.2.授权操作
            //3.判断页面用户输入的密码，和数据库中的密码是否一致
            org.springframework.security.core.userdetails.User securityUser =
                    new org.springframework.security.core.userdetails.User(username,"{noop}"+user.getPassword(),list);


            //4.返回用户名、密码、授权的角色/权限
            /**
             * 相当于xml文件中的
             * <security:user-service>
             *   <security:user name="admin" password="{noop}1234" authorities="ROLE_ADMIN"/>
             * </security:user-service>
             */
            return securityUser;
        }
    }
}
